API : Importation json

Auteur·rice

Claude Grasland

Date de publication

2025-02-11

Le but de ce chapitre n’est pas d’apprendre en détail l’ensemble des possibilités qu’offrent les API pour des utilisateurs avancés, mais de fournir aux étudiants en data mining un certain nombre de solutions simples (mais efficaces) pour extraire des données de façon interactive et assurer leur mise à jour régulière.

On charge les packages utiles :

knitr::opts_chunk$set(echo = TRUE, warning= FALSE, message = FALSE, error=FALSE)

## Affichage de tableaux
library(knitr)

## Requêtes web
library(httr)
library(jsonlite)

## Tidyverse & co
library(dplyr, warn.conflicts = T, quietly = T)
library(ggplot2)

Choix d’une API

La première étape consiste à choisir l’API qui nous intéresse parmi plus de 600.

Le site public.opendatasoft

Nous allons centrer notre chapitre sur le site public.opendatasoft qui permet d’accèder à des centaines d’API à l’aide de requêtes normalisées. Sans apprendre en détail le fonctionnement de cette API, on va montrer comment créer de petites fonctions facilitant le travail d’exportation des variables ou des données.

On peut se rendre sur le site pour parcourir les API proposées en allant à l’adresse : https://public.opendatasoft.com

Catalogue des API

Plutôt que de pacourir le site web, on peut télécharger le catalogue général des bases de données du site public.opendatasoft … en se servant d’une requête API

x<-GET('https://public.opendatasoft.com/api/datasets/1.0/search/?q=&rows=1000&start=0')
y<-fromJSON(rawToChar((x$content)))
cat<-y$datasets$metas
row.names(cat)<-y$datasets$datasetid
kable(head(cat[,c(12,1,6,7,8)]),row.names = T)
license_url domain license description publisher
analytical-house-prices-indicators public Custom License (see reference link) OECD
sirene-v3-liens-de-successions-siret https://www.etalab.gouv.fr/wp-content/uploads/2018/11/open-licence.pdf public Open License v2.0 INSEE
unix_domaine_professionnel_v324_utf8 https://www.etalab.gouv.fr/wp-content/uploads/2014/05/Licence_Ouverte.pdf public Open License v1.0 Pôle Emploi
world-administrative-boundaries-countries http://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/ public Open Government Licence v3.0 Based on dataset published by : World Food Programme (UN agency)
georef-italy-ripartizione-geografica https://creativecommons.org/licenses/by/3.0/ public CC BY 3.0 Opendatasoft
georef-italy-ripartizione-geografica-millesime https://creativecommons.org/licenses/by/3.0/ public CC BY 3.0 Opendatasoft

On a donc récupéré un tableau qui comporte 605 lignes correspondant à 605 bases de données. Le nom des lignes du tableau indique le code de la base de données que l’on va utiliser ensuite dans les requêtes.

Choix d’un tableau de données

On suppose que le choix s’est porté sur la base de données dont le nom de code est prix-des-carburants-j-1

L’onglet information nous indique qu’il s’agit d’un site produit par le minstère de l’économie et des finances pour faciliter l’accès en temps réel au prix des carburants dans les stations services. Le but est d’informer les conosmmateurs des stations les moins chères à proximité de son domicile afin de stimuler la concurrence et faire baisser les prix.

Il est indiqué que la base se limite aux prix des douze derniers mois mais nous avons pu vérifier qu’on trouve en fait des données sur plus de trois ans.

Liste des variables

Avant de télécharger les données, on regarde précisément la liste des variables disponibles. On peut le faire sur le site web en parcourant les onglets. Mais il est également possible de lancer une requête pour connaître les variables du tableau que l’on va télécharger ainsi que les variables pouvant servir de “facettes” c’est-à-dire permettant d’effectuer des requêtes.

tab<-"prix-des-carburants-j-1"
url<-paste("https://public.opendatasoft.com/api/v2/catalog/datasets/",tab,"?",sep="")
x<-GET(url)
y<-fromJSON(rawToChar(x$content))
var<-y$dataset$fields

head(var)
            name description annotations.facet annotations.multivalued
1             id          NA                NA                    <NA>
2             cp          NA              TRUE                    <NA>
3            pop          NA              TRUE                    <NA>
4        address          NA                NA                    <NA>
5   com_arm_name          NA              TRUE                    <NA>
6 automate_24_24          NA              TRUE                    <NA>
  annotations.facetsort annotations.timeserie_precision annotations.unit
1                  <NA>                            <NA>             <NA>
2                  <NA>                            <NA>             <NA>
3                  <NA>                            <NA>             <NA>
4                  <NA>                            <NA>             <NA>
5                  <NA>                            <NA>             <NA>
6                  <NA>                            <NA>             <NA>
  annotations.decimals
1                   NA
2                   NA
3                   NA
4                   NA
5                   NA
6                   NA
                                                      label type
1                                               Identifiant text
2                                               Code Postal text
3                                                  Présence text
4                                                   Adresse text
5 Nom Officiel Commune / Arrondissement Municipal Majuscule text
6                                            Automate 24-24 text

On extrait du tableau les colonnes qui fournissent le nom des variables, leur définition et leur type

var <- var  %>% select(name, label, type)
kable(var)
name label type
id Identifiant text
cp Code Postal text
pop Présence text
address Adresse text
com_arm_name Nom Officiel Commune / Arrondissement Municipal Majuscule text
automate_24_24 Automate 24-24 text
timetable Timetable text
fuel Carburant text
shortage Rupture text
update Mise à jour datetime
price_gazole Prix Gazole double
price_sp95 Prix SP95 double
price_sp98 Prix SP98 double
price_gplc Prix GPLc double
price_e10 Prix E10 double
price_e85 Prix E85 double
services Services text
brand Marque text
name Nom text
geo_point Geo Point geo_point_2d
com_arm_code Code officiel commune ou arrondissement text
epci_code Code Officiel EPCI text
epci_name Nom Officiel EPCI text
dep_code Code Officiel Département text
dep_name Nom Officiel Département text
reg_code Code Officiel Région text
reg_name Nom Officiel Région text

On peut transformer le programme que l’on vient d’executer en fonction pour un usage plus simple :

get_variables<-function(idtab = "prix-des-carburants-j-1") {
  url<-paste("https://public.opendatasoft.com/api/v2/catalog/datasets/",idtab,"?",sep="")
  x<-GET(url)
  y<-fromJSON(rawToChar((x$content)))
  var<-y$dataset$fields
  var <- var %>% select(name, label, type)
  return(var)
}

On peut désormais appliquer notre fonction sur n’importe quel autre tableau du catalogue. Par exemple, si on choisit le tableau qualite_de-lair-france on obtient la liste de variables suivante :

var<-get_variables("qualite-de-lair-france")
kable(var)
name label type
country Country Code text
city City text
location Location text
coordinates Coordinates geo_point_2d
measurements_parameter Pollutant text
measurements_sourcename Source Name text
measurements_unit Unit text
measurements_value Value double
measurements_lastupdated Last Updated datetime
country_name_en Country Label text

Récupération des données

Pour des utilisateurs non spécialiste, il est difficile de lancer une requête complexe qui suppose une maîtrise avancée des API et des protocoles de requête SOAP et REST. Nous allons opter ici pour une stratégie pragmatique (mais efficace) qui consiste à :

  1. Utiliser l’interface public.opendatasoft pour rédiger une requête
  2. Récupérer le lien de téléchargement
  3. Télécharger les données correspondant à la requête
  4. Effectuer les opérations de nettoyage des données et réaliser un graphique
  5. Modifier le lien et effectuer à nouveau le étapes 3 et 4
  6. Construire une fonction paramétrique de téléchargement + nettoyage + visualisation …

Pour illustrer cette stratégie, nous allons essayer de créer dans R une fonction automatisée qui télécharge le prix du carburant d’une commune et produit un graphique montrant son évolution au cours du temps dans les dfférentes stations. Nous allons ainsi essayer de reconstituer une application assez proche de celle du ministère de l’économie intitulée “essence pas cher”.

Essence pas cher

Nous ne chercherons toutefois pas à obtenir uniquement le dernier prix en date des stations mais plutôt à voir lesquelles sont les plus ou les mons chers sur une période de quelques années.

1. Rédaction d’une requête sur public opendatasoft

On utilise les filtres de l’interface pour sélectionner la commune cible à l’aide de son code postal (ex. 94370 = Sucy-en-Brie) et du type carburant (ex. Gazole) :

Filtres

2. Récupération du lien de téléchargement

Une fois terminée la mise en place des filtres, on se déplace vers la fenêtre “Export” et on choisit le type de format de sortie que l’on souhaite obtenir. Nous pourrions obtenir des fichiers au format texte (.csv) ou tableur (.xls) mais nous allons adopter ici le format .json qui est plus universel dans le domaine de la data science et qui simplifie les transferts de données entre utilisateurs de différents langages de programmation tels que R ou Python.

Un click de souris sur le lien nous permet de récupérer l’URL de téléchargement :

URL

Même si certains caractères spéciaux sont difficiles à comprendre comme %3A ou %22 on devine assez facilement la fonction des différents segments de la chaine de caractère qui constitue l’URL de requête :

  • adresse du site web opendatasoft : https://public.opendatasoft.com/api/explore/v2.1/catalog/datasets/
  • choix de la base de données : prix-des-carburants-j-1
  • format d’export et langue : exports/json?lang=fr
  • selection du carburant : &refine=fuel%3A%22Gazole%22
  • selection de la commune par son code postal : &qv1=(94370)
  • fuseau horaire (pour dater la requête) : &timezone=Europe%2FParis

3. Recupération des données à partir de l’URL

Nous pouvons maintenant rédiger un petit programme très simple qui va récupérer les données à partir de ce lien

link<-"https://public.opendatasoft.com/api/explore/v2.1/catalog/datasets/prix-des-carburants-j-1/exports/json?lang=fr&refine=fuel%3A%22Gazole%22&qv1=(94370)&timezone=Europe%2FParis"
y<-fromJSON(link)
head(y)
        id    cp pop                     address com_arm_name automate_24_24
1 94370007 94370   R     13 Rue Maurice Berteaux SUCY-EN-BRIE            Non
2 94370008 94370   R 63/71 AV DU GENERAL LECLERC SUCY-EN-BRIE            Oui
3 94370007 94370   R     13 Rue Maurice Berteaux SUCY-EN-BRIE            Non
4 94370003 94370   R              1 Rue de Paris SUCY-EN-BRIE            Oui
5 94370008 94370   R 63/71 AV DU GENERAL LECLERC SUCY-EN-BRIE            Oui
6 94370003 94370   R              1 Rue de Paris SUCY-EN-BRIE            Oui
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               timetable
1 {"Dimanche": {"fermeture": "22.00", "ouvert": 1, "ouverture": "07.00"}, "Jeudi": {"fermeture": "23.00", "ouvert": 1, "ouverture": "06.00"}, "Lundi": {"fermeture": "23.00", "ouvert": 1, "ouverture": "06.00"}, "Mardi": {"fermeture": "23.00", "ouvert": 1, "ouverture": "06.00"}, "Mercredi": {"fermeture": "23.00", "ouvert": 1, "ouverture": "06.00"}, "Samedi": {"fermeture": "23.00", "ouvert": 1, "ouverture": "06.00"}, "Vendredi": {"fermeture": "23.00", "ouvert": 1, "ouverture": "06.00"}}
2 {"Dimanche": {"fermeture": "21.00", "ouvert": 1, "ouverture": "08.00"}, "Jeudi": {"fermeture": "21.00", "ouvert": 1, "ouverture": "07.00"}, "Lundi": {"fermeture": "21.00", "ouvert": 1, "ouverture": "07.00"}, "Mardi": {"fermeture": "21.00", "ouvert": 1, "ouverture": "07.00"}, "Mercredi": {"fermeture": "21.00", "ouvert": 1, "ouverture": "07.00"}, "Samedi": {"fermeture": "21.00", "ouvert": 1, "ouverture": "08.00"}, "Vendredi": {"fermeture": "21.00", "ouvert": 1, "ouverture": "07.00"}}
3 {"Dimanche": {"fermeture": "22.00", "ouvert": 1, "ouverture": "07.00"}, "Jeudi": {"fermeture": "23.00", "ouvert": 1, "ouverture": "06.00"}, "Lundi": {"fermeture": "23.00", "ouvert": 1, "ouverture": "06.00"}, "Mardi": {"fermeture": "23.00", "ouvert": 1, "ouverture": "06.00"}, "Mercredi": {"fermeture": "23.00", "ouvert": 1, "ouverture": "06.00"}, "Samedi": {"fermeture": "23.00", "ouvert": 1, "ouverture": "06.00"}, "Vendredi": {"fermeture": "23.00", "ouvert": 1, "ouverture": "06.00"}}
4                                                                                                                                                                                                                                                                                                                     {"Dimanche": {"ouvert": 1}, "Jeudi": {"ouvert": 1}, "Lundi": {"ouvert": 1}, "Mardi": {"ouvert": 1}, "Mercredi": {"ouvert": 1}, "Samedi": {"ouvert": 1}, "Vendredi": {"ouvert": 1}}
5 {"Dimanche": {"fermeture": "21.00", "ouvert": 1, "ouverture": "08.00"}, "Jeudi": {"fermeture": "21.00", "ouvert": 1, "ouverture": "07.00"}, "Lundi": {"fermeture": "21.00", "ouvert": 1, "ouverture": "07.00"}, "Mardi": {"fermeture": "21.00", "ouvert": 1, "ouverture": "07.00"}, "Mercredi": {"fermeture": "21.00", "ouvert": 1, "ouverture": "07.00"}, "Samedi": {"fermeture": "21.00", "ouvert": 1, "ouverture": "08.00"}, "Vendredi": {"fermeture": "21.00", "ouvert": 1, "ouverture": "07.00"}}
6                                                                                                                                                                                                                                                                                                                     {"Dimanche": {"ouvert": 1}, "Jeudi": {"ouvert": 1}, "Lundi": {"ouvert": 1}, "Mardi": {"ouvert": 1}, "Mercredi": {"ouvert": 1}, "Samedi": {"ouvert": 1}, "Vendredi": {"ouvert": 1}}
               fuel                   shortage                    update
1 Gazole, E10, SP98            SP95, E85, GPLc 2024-07-19T23:50:00+02:00
2            Gazole E85, SP95, GPLc, E10, SP98 2022-10-24T00:01:00+02:00
3 Gazole, E10, SP98      SP95, E85, SP95, GPLc 2022-11-08T00:01:00+01:00
4 Gazole, E10, SP98                       SP95 2025-01-22T06:51:00+01:00
5 Gazole, E10, SP98            SP95, E85, GPLc 2022-12-06T00:01:00+01:00
6 Gazole, E10, SP98                       SP95 2024-12-10T06:41:00+01:00
  price_gazole price_sp95 price_sp98 price_gplc price_e10 price_e85
1     0.001778         NA   0.001988         NA  0.001878        NA
2     0.001818         NA         NA         NA        NA        NA
3     0.001847         NA   0.001679         NA  0.001569        NA
4     0.001784         NA   0.001928         NA  0.001818        NA
5     0.001833         NA   0.001759         NA  0.001649        NA
6     0.001668         NA   0.001822         NA  0.001730        NA
                                                                                                                                                                                                                              services
1 Boutique alimentaire, Boutique non alimentaire, Restauration à emporter, Vente de fioul domestique, Station de gonflage, Carburant additivé, Lavage automatique, Vente de gaz domestique (Butane, Propane), Wifi, Automate CB 24, 24
2                     Boutique alimentaire, Boutique non alimentaire, Station de gonflage, Carburant additivé, Lavage automatique, Lavage manuel, Vente de gaz domestique (Butane, Propane), DAB (Distributeur automatique de billets)
3 Boutique alimentaire, Boutique non alimentaire, Restauration à emporter, Vente de fioul domestique, Station de gonflage, Carburant additivé, Lavage automatique, Vente de gaz domestique (Butane, Propane), Wifi, Automate CB 24, 24
4                                                                                                                                                                                                                                 NULL
5                     Boutique alimentaire, Boutique non alimentaire, Station de gonflage, Carburant additivé, Lavage automatique, Lavage manuel, Vente de gaz domestique (Butane, Propane), DAB (Distributeur automatique de billets)
6                                                                                                                                                                                                                                 NULL
         brand              name geo_point.lon geo_point.lat com_arm_code
1        Total       SARL DURMUS       2.51743      48.77333        94071
2         <NA>              <NA>            NA            NA         <NA>
3        Total       SARL DURMUS       2.51743      48.77333        94071
4 Esso Express ESSO PETIT MARAIS       2.49956      48.77306        94071
5         <NA>              <NA>            NA            NA         <NA>
6 Esso Express ESSO PETIT MARAIS       2.49956      48.77306        94071
  epci_code                epci_name dep_code     dep_name reg_code
1 200054781 Métropole du Grand Paris       94 Val-de-Marne       11
2      <NA>                     <NA>     <NA>         <NA>     <NA>
3 200054781 Métropole du Grand Paris       94 Val-de-Marne       11
4 200054781 Métropole du Grand Paris       94 Val-de-Marne       11
5      <NA>                     <NA>     <NA>         <NA>     <NA>
6 200054781 Métropole du Grand Paris       94 Val-de-Marne       11
       reg_name
1 Île-de-France
2          <NA>
3 Île-de-France
4 Île-de-France
5          <NA>
6 Île-de-France

A la différence de la méthode GET vue au chapitre précédent, nous récupérons directement le fichier de données sans avoir besoin d’effectuer des transformations de type RawToChar. C’est donc beaucoup plus simple mais, en contrepartie, nous perdons toute une série d’informations qu’apportait la procédure dans les règles de l’art (date de téléchargement, messages d’erreur, version des données, etc.).

4. Nettoyage des données

Nous procédons ensuite à un petit nettoyage pour ne garder que les variables utiles :

names(y)
 [1] "id"             "cp"             "pop"            "address"       
 [5] "com_arm_name"   "automate_24_24" "timetable"      "fuel"          
 [9] "shortage"       "update"         "price_gazole"   "price_sp95"    
[13] "price_sp98"     "price_gplc"     "price_e10"      "price_e85"     
[17] "services"       "brand"          "name"           "geo_point"     
[21] "com_arm_code"   "epci_code"      "epci_name"      "dep_code"      
[25] "dep_name"       "reg_code"       "reg_name"      
don <- y %>% select(name,address, update, price = price_gazole ) %>% 
  mutate(update =as.Date(update)) %>%
  arrange(update)

Il y a toutefois une mauvaise surprise … les données semblent erronées à partir d’une certaine date

ggplot(don) +aes(x=update, y=price, col=address) + geom_point()

En fait … les chiffres qui sont fournis après le 26 mars ont été divisés mystérieusement par 1000. Il faut donc corriger ce problème :

library(ggplot2)
don<-don %>%  mutate(price_OK = case_when(price ==0 ~ NA,
                             price < 1 ~ price*1000,
                             TRUE ~ price))
ggplot(don) +aes(x=update, y=price_OK, col=address) + geom_point()

On note qu’il este une valeur aberrante mais sinon il est désormais possible de bien suivre l’évolution des prix au cours des trois dernières années et de repérer quelles est la station la moins chèr aux différentes dates.

5. Changement de lien

Essayons maintenant de reprendre l’ensemble de notre programme en changeant juste de commune dans le lien initial. On va ici soigner la rédaction du programme car nous comptons ensuite le transformer en fonction

On remplace le code postal de Sucy-en-Brie (94370) par celui d’Ivry-sur-Seine(94200).

# Choix du lien (changement du code postal)
link<-"https://public.opendatasoft.com/api/explore/v2.1/catalog/datasets/prix-des-carburants-j-1/exports/json?lang=fr&refine=fuel%3A%22Gazole%22&qv1=(94200)&timezone=Europe%2FParis"

# Importation des données
y<-fromJSON(link)

# Selection des variables
don <- y %>% select(name,address, update, price = price_gazole ) %>% 
  mutate(update =as.Date(update)) %>%
  arrange(update)

# Nettoyage des erreurs principales
don<-don %>%  mutate(price_OK = case_when(price ==0 ~ NA,
                             price < 1 ~ price*1000,
                             TRUE ~ price))

# Réalisation d'un graphique
ggplot(don) +aes(x=update, y=price_OK, col=address) + geom_point()

6. Rédaction d’une Fonction

On peut maintenant écrire une fonction qui ne va dépendre que du code postal et va fournir en sortie le tableau de données. Tout ce que nous avons à faire est de modifier le lien en fonction du code postal qui sera le paramètre de la fonction.

Pour cela nous utilisons la commande R pasteO()qui permet de coller des chaînes de caractères sans ajouter d’expaces. Ici nous recollons le début de l’URL, le code de la commune que nous avons modifié et la fin de l’URL.

gazole_tab <- function(code="94370") { 
# Choix du lien (changement du code postal)
link<-paste0("https://public.opendatasoft.com/api/explore/v2.1/catalog/datasets/prix-des-carburants-j-1/exports/json?lang=fr&refine=fuel%3A%22Gazole%22&qv1=(", code,")&timezone=Europe%2FParis")

# Importation des données
y<-fromJSON(link)

# Selection des variables
tab <- y %>% select(name,address, update, price = price_gazole ) %>% 
  mutate(update =as.Date(update)) %>%
  arrange(update)

# Nettoyage des erreurs principales
tab<-tab %>%  mutate(price_OK = case_when(price ==0 ~ NA,
                             price < 1 ~ price*1000,
                             TRUE ~ price))

return(tab)

}

Pour tester notre fonction gazole_tab(), on prend en exemple une nouvelle commune, par exemple Saint-Maur des Fossés (94100) :

res<-gazole_tab("94100")
head(res)
              name            address     update price price_OK
1             <NA>   57 BD DE CRETEIL 2021-02-18 1.499    1.499
2 Carrefour Market    57, Rue Delenue 2021-02-18 1.366    1.366
3        ESSO FOCH 99/101 Avenue Foch 2021-02-18 1.366    1.366
4             <NA>  29 bvd de créteil 2021-02-18 1.452    1.452
5 Carrefour Market    57, Rue Delenue 2021-02-19 1.371    1.371
6        ESSO FOCH 99/101 Avenue Foch 2021-02-19 1.371    1.371

Mais on pourrait aussi faire une fonction gazole_graph()qui renvoie non pas le tableau mais le graphique :

gazole_graph <- function(code="94370") { 
# Choix du lien (changement du code postal)
link<-paste0("https://public.opendatasoft.com/api/explore/v2.1/catalog/datasets/prix-des-carburants-j-1/exports/json?lang=fr&refine=fuel%3A%22Gazole%22&qv1=(", code,")&timezone=Europe%2FParis")

# Importation des données
y<-fromJSON(link)

# Selection des variables
don <- y %>% select(name,address, update, price = price_gazole ) %>% 
  mutate(update =as.Date(update)) %>%
  arrange(update)

# Nettoyage des erreurs principales
don<-don %>%  mutate(price_OK = case_when(price ==0 ~ NA,
                             price < 1 ~ price*1000,
                             TRUE ~ price))

# Réalisation d'un graphique
graph<-ggplot(don) +aes(x=update, y=price_OK, col=address) + geom_point()

return(graph)

}

On teste la fonction sur Saint-Maur des Fossés (94100) :

gazole_graph("94100")

Mais le plus intéressant est de faire une fonction unique gazole()qui permet de renvoyer à la fois le tableau et le graphique en indiquant en sortie une liste d’objets comprenant à la fois le tableau (objet de type data.frame) et le graphique (objet de type ggplot2).

gazole <- function(code="94370") { 
# Choix du lien (changement du code postal)
link<-paste0("https://public.opendatasoft.com/api/explore/v2.1/catalog/datasets/prix-des-carburants-j-1/exports/json?lang=fr&refine=fuel%3A%22Gazole%22&qv1=(", code,")&timezone=Europe%2FParis")

# Importation des données
y<-fromJSON(link)

# Selection des variables
tab <- y %>% select(name,address, update, price = price_gazole ) %>% 
  mutate(update =as.Date(update)) %>%
  arrange(update)

# Nettoyage des erreurs principales
tab<-tab %>%  mutate(price_OK = case_when(price ==0 ~ NA,
                             price < 1 ~ price*1000,
                             TRUE ~ price))

# Réalisation d'un graphique
graph<-ggplot(don) +aes(x=update, y=price_OK, col=address) + geom_point()

return(list("tab"=tab, "graph"=graph))

}

Il suffit maintenant d’executer une seule fois la fonction (un seul appel de l’API) pour pouvoir ensuite au choix utiliser le tableau ou afficher le graphique.

res<-gazole("94100")
head(res$tab)
              name            address     update price price_OK
1             <NA>   57 BD DE CRETEIL 2021-02-18 1.499    1.499
2 Carrefour Market    57, Rue Delenue 2021-02-18 1.366    1.366
3        ESSO FOCH 99/101 Avenue Foch 2021-02-18 1.366    1.366
4             <NA>  29 bvd de créteil 2021-02-18 1.452    1.452
5 Carrefour Market    57, Rue Delenue 2021-02-19 1.371    1.371
6        ESSO FOCH 99/101 Avenue Foch 2021-02-19 1.371    1.371
res$graph

Conclusion

Ce chapitre a permis de combiner trois apprentissages fondamentaux du data mining qui seront repris ensuie à plusieurs reprises :

  1. Utiliser des API pour récupérer directement ses données sans effectuer de téléchargement “à la main”.
  2. Nettoyer les données reçues avant de les utiliser et automatiser autant que possible les procédures de nettoyages.
  3. Créer ses propres fonctions pour automatiser les tâches de récupération des données, nettoyage et production de tableaux ou graphiques.